約 4,598,250 件
https://w.atwiki.jp/tmiya/pages/128.html
Scala ひと巡り sealed クラス (Sealed Classes) 原ページ sealed クラスは、継承するテンプレートを継承されるクラスと同じソースファイル中で定義する場合を除き、直接には継承できません。しかし、sealed クラスのサブクラスはどこででも継承できます。 sealed クラスは sealed 修飾子を使って定義できます。 もしパターンマッチのセレクタが sealed クラスのインスタンスなら、パターンマッチングのコンパイル時に、与えられたパターンセットが網羅的ではないと診断する警告が出ます。すなわち、実行時に MatchError [60] が発生する可能性があるということです。 @unchecked アノテーション [47] をマッチ式のセレクタに適用すると、そうでなければ発せられるはずの、非網羅的パターンマッチに関するあらゆる警告が抑制されます。 例えば、次のメソッド定義に対しては警告はありません。 def f(x Option[Int]) = (x @unchecked) match { case Some(y) = y } @unchecked アノテーションがなければ、Scala コンパイラはパターンマッチが非網羅的であると推論し、Optionが sealed クラスなので警告を発します。 Scala ひと巡り トレイト (Traits) 原ページ トレイトは、Java のインターフェースに似て、サポートするメソッドのシグニチャを記述することで、オブジェクトの型定義に使えます。Java と異なり、Scala のトレイトは部分的に実装できます。すなわち、複数のメソッドのデフォルト実装を定義できます。クラス [2]と異なり、トレイトはコンストラクタ・パラメータを持てません。 次は 1 つの例です trait Similarity { def isSimilar(x Any) Boolean def isNotSimilar(x Any) Boolean = !isSimilar(x) } このトレイトは 2 つのメソッド isSimilar と isNotSimilar からなります。isSimilar が具象の(具体的な)メソッド実装を提供せず(Java 用語では抽象)、メソッド isNotSimilar は具象実装を定義します。従って、このトレイトを統合するクラスだけが、isSimilar に具象の実装を提供する必要があります。isNotSimilar の振る舞いは、トレイトから直接に継承します。トレイトは通常、ミックスインクラス合成 [5]を用いて、クラス [61](あるいは他のトレイト)に統合されます class Point(xc Int, yc Int) extends Similarity { var x Int = xc var y Int = yc def isSimilar(obj Any) = obj.isInstanceOf[Point] obj.asInstanceOf[Point].x == x } object TraitsTest extends Application { val p1 = new Point(2, 3) val p2 = new Point(2, 4) val p3 = new Point(3, 3) println(p1.isNotSimilar(p2)) println(p1.isNotSimilar(p3)) println(p1.isNotSimilar(2)) } 次はプログラムの出力です false true true Scala ひと巡り 上限 型境界 (Upper Type Bounds) 原ページ Scala では、型パラメータ [16]と抽象型 [21]は、型境界による制約を受けます。そのような型境界は、型変数の具象値を制限し、型のメンバーについてさらに多くの情報を明らかにします。上限型境界 T A は、型変数 T が型 A のサブ型を参照することを宣言します。 次は、多相的メソッド [25] findSimilar の実装について、上限型境界に頼る例です trait Similar { def isSimilar(x Any) Boolean } case class MyInt(x Int) extends Similar { def isSimilar(m Any) Boolean = m.isInstanceOf[MyInt] m.asInstanceOf[MyInt].x == x } object UpperBoundTest extends Application { def findSimilar[T Similar](e T, xs List[T]) Boolean = if (xs.isEmpty) false else if (e.isSimilar(xs.head)) true else findSimilar[T](e, xs.tail) val list List[MyInt] = List(MyInt(1), MyInt(2), MyInt(3)) println(findSimilar[MyInt](MyInt(4), list)) println(findSimilar[MyInt](MyInt(2), list)) } 上限型境界アノテーションがなければ、メソッド findSimilar 中でメソッド isSimilar を呼び出すことはできません。 下限型境界の使用方法は、次で述べます [19]。 Scala ひと巡り 下限 型境界 (Lower Type Bounds) 原ページ 上限型境界 [18]は、型を他の型のサブ型へ制限し、他方、下限型境界は、型が他の型のスーパー型であると宣言します。項 T A は、型パラメータ T あるいは抽象型 T が、型 A のスーパー型を参照することを表します。 次はそれが役に立つ例です case class ListNode[T](h T, t ListNode[T]) { def head T = h def tail ListNode[T] = t def prepend(elem T) ListNode[T] = ListNode(elem, this) } 上記のプログラムは prepend (先頭に追加)操作を使って連結リストを実装します。残念ながら、この型は、クラス ListNode の型パラメータ中にあって、非変です; すなわち、型 ListNode[String]は 型 List[Object]のサブ型ではありません。変位指定アノテーション [17]の助けを借りて、このようなサブ型のセマンティクスを表現できます case class ListNode[+T](h T, t ListNode[T]) { ... } 残念ながら、共変の変位指定は型変数を共変の位置で使う場合のみ可能なので、このプログラムはコンパイルできません。型変数 T はメソッド prepend のパラメータ型として現われるので、この規則は破られています。しかし、下限型境界の助けを借りれば、T が共変の位置のみに現れる prepend メソッドを実装できます。 次は対応するコードです case class ListNode[+T](h T, t ListNode[T]) { def head T = h def tail ListNode[T] = t def prepend[U T](elem U) ListNode[U] = ListNode(elem, this) } 新しい prepend メソッドは、少しばかり制約の少ない型を持つことに注意してください。これにより、たとえば、既に存在するリストの先頭にスーパー型のオブジェクトを追加できます。得られるリストは、このスーパー型のリストです。 次は、そのことを示すコードです object LowerBoundTest extends Application { val empty ListNode[Null] = ListNode(null, null) val strList ListNode[String] = empty.prepend("hello") .prepend("world") val anyList ListNode[Any] = strList.prepend(12345) } Scala ひと巡り 明示的に型付けられた自己参照 (Explicitly Typed Self References) 原ページ 拡張可能なソフトウェアを開発するとき、値 this の型を宣言したくなることが時々あります。興味を引く例として、グラフデータ構造の小規模で拡張可能な表現を Scala で考えてみましょう。 次はグラフを記述する定義です abstract class Graph { type Edge type Node NodeIntf abstract class NodeIntf { def connectWith(node Node) Edge } def nodes List[Node] def edges List[Edge] def addNode Node } グラフはノードとエッジのリストからなり、それらノードとエッジの両方の型とも抽象のままです。 The use of abstract types [21] allows implementations of trait Graph to provide their own concrete classes for nodes and edges. 抽象型 [21]を使えば、ノードとエッジに対してそれら自身の具象クラスを提供できるようにする、トレイト Graph を実装できます。 さらに、グラフに新しいノードを加える、メソッド addNode があります。ノードはメソッド connectWith を使って連結します。 次のプログラムは、クラス Graph の 1 つの考え得る実装です。 abstract class DirectedGraph extends Graph { type Edge EdgeImpl class EdgeImpl(origin Node, dest Node) { def from = origin def to = dest } class NodeImpl extends NodeIntf { def connectWith(node Node) Edge = { val edge = newEdge(this, node) edges = edge edges edge } } protected def newNode Node protected def newEdge(from Node, to Node) Edge var nodes List[Node] = Nil var edges List[Edge] = Nil def addNode Node = { val node = newNode nodes = node nodes node } } クラス DirectedGraph は、部分的な実装を提供することで、Graph クラスを特化します。実装は本当に部分的です。なぜなら DirectedGraph をさらに拡張できるようにしたいからです。そのために、このクラスではすべての実装詳細をオープンにし、このようにノードとエッジの両方とも抽象のままにしています。にもかかわらず、クラス DirectedGraph は、クラス EdgeImpl へ境界を厳しくすることで、エッジ型の実装についてさらなる詳細を明示しています。また、クラス EdgeImpl と NodeImpl で表される、エッジとノードの準備的な実装がいくつかあります。部分的なグラフ実装の中で新しいノードとエッジオブジェクトを生成する必要があるので、ファクトリメソッド newNode と newEdge も加えなければなりません。メソッド addNode と connectWith は共に、これらのファクトリメソッドを使って定義します。メソッド connectWith の実装をよく見ると、エッジを生成するために、自己参照 this をファクトリメソッド newEdge に渡す必要があることがわかります。しかし this は型 NodeImpl に割り当てられており、それは対応するファクトリメソッドによって要請される型 Node に互換ではありません。その結果、上記のプログラムは正しくなく、Scala コンパイラはエラーメッセージを発行します。 Scala では、自己参照 this に他の型を明示的に与えることで、クラスを(将来実装されるであろう)もう 1 つの型に結び付けることができます。このメカニズムを使って上記コードを修正できます。明示的な自己型は、クラス DirectedGraph の本体中で指定します。 次は修正したプログラムです abstract class DirectedGraph extends Graph { ... class NodeImpl extends NodeIntf { self Node = def connectWith(node Node) Edge = { val edge = newEdge(this, node) // 今度は OK edges = edge edges edge } } ... } クラス NodeImpl の新しい定義では、this は型 Node を持っています。型 Node は抽象ですから、NodeImpl が本当に Node のサブ型かどうかはまだわからず、Scala の型システムは、このクラスのインスタンス化を許してくれません。 But nevertheless, we state with the explicit type_annotation of this that at some point, (a subclass of) NodeImpl has to denote a subtype of type Node in order to be instantiatable . しかしそれにもかかわらず、インスタンス化できるようにするために、ある時点で NodeImpl (のサブクラスの 1 つ)が型 Node のサブ型を表さなければならないことを、this の明示的なアノテーション型を用いて記述します。 次は、DirectedGraph の具象特化であり、すべての抽象クラスメンバが具象に変わっています。 class ConcreteDirectedGraph extends DirectedGraph { type Edge = EdgeImpl type Node = NodeImpl protected def newNode Node = new NodeImpl protected def newEdge(f Node, t Node) Edge = new EdgeImpl(f, t) } この場合、NodeImpl をインスタンス化できます。なぜなら、今度は NodeImpl が(単純に NodeImpl のエイリアスである)型 Node のサブ型を表すことがわかるからです。 次は、クラス ConcreteDirectedGraph の使用方法を示す例です object GraphTest extends Application { val g Graph = new ConcreteDirectedGraph val n1 = g.addNode val n2 = g.addNode val n3 = g.addNode n1.connectWith(n2) n2.connectWith(n3) n1.connectWith(n3) } Scala ひと巡り サブクラス化 (Subclassing) 原ページ Scala のクラスは拡張可能です。サブクラスの機構により、与えられたスーパークラスの全メンバーの継承と、クラスメンバの追加定義によって、クラスを特化できます。 次は 1 つの例です class Point(xc Int, yc Int) { val x Int = xc val y Int = yc def move(dx Int, dy Int) Point = new Point(x + dx, y + dy) } class ColorPoint(u Int, v Int, c String) extends Point(u, v) { val color String = c def compareWith(pt ColorPoint) Boolean = (pt.x == x) (pt.y == y) (pt.color == color) override def move(dx Int, dy Int) ColorPoint = new ColorPoint(x + dy, y + dy, color) } この例では最初に、場所を表す新しいクラス Point を定義します。次に、クラス Point を拡張するクラス ColorPoint を定義します。 これは次のような結果になります: クラス ColorPoint は、そのスーパークラス Point からすべてのメンバーを継承します。;この場合、メソッド move と同様、値 x、y も継承します。 サブクラス ColorPoint は、(継承した)メソッドの集合に新しいメソッド compareWith を加えます。 Scala ではメンバー定義をオーバライドできます; この場合、クラス Point から継承した move メソッドをオーバライドします。これにより、ColorPoint オブジェクトのクライアントは、クラス Point の move メソッドにアクセスできなくなります。クラス ColorPoint 内では、継承されたメソッド move は スーパー呼び出し super.move(...) を使ってアクセスできます。メソッドオーバーライドが非変の(つまり、オーバーライドするメソッドが同じシグニチャを持たなければならない) Java と異なり、Scala では反変/共変方式でメソッドをオーバライドできます。上の例では、このフィーチャーを利用してメソッド move に、スーパークラス Point で指定された Point オブジェクトを返す代わりに ColorPoint オブジェクトを返させています。 サブクラスはサブ型を定義します; このことは今の場合、Point オブジェクトが必要とされるときはいつでも、ColorPoint オブジェクトを使えることを意味します。 複数の他クラスを継承したい場合、純粋なサブクラス化ではなく、ミックスインベースのクラス合成 [5] を利用する必要があります。 Scala ひと巡り ローカルな型推論 (Local Type Inference) 原ページ Scala は、プログラマが明白なアノテーション型を書かなくても済む、組み込みの型推論機構を持っています。たとえば Scalaでは、変数の型を指定する必要がないことがよくあります。なぜなら、コンパイラが変数の初期化式から型を推論できるからです。同様にメソッドの戻り値型もしばしば省略できます。なぜなら、それらは本体の型に対応するので、コンパイラが推論できるからです。 次は 1 つの例です object InferenceTest1 extends Application { val x = 1 + 2 * 3 // x の型は Int val y = x.toString() // y の型は String def succ(x Int) = x + 1 // メソッド succ は Int 値を返す } 再帰的なメソッドについては、コンパイラは結果型を推論できません。次のプログラムは、この理由でコンパイルできません。 object InferenceTest2 { def fac(n Int) = if (n == 0) 1 else n * fac(n - 1) } 多相的メソッド [25]を呼ぶあるいは、ジェネリッククラス [16]をインスタンス化するとき、型パラメータの指定も必須ではありません。Scala コンパイラは、コンテキストや実際のメソッド/コンストラクタ・パラメータの型からそのような記述されていない型パラメータを推論します。 次はこのことを示す例です case class MyPair[A, B](x A, y B); object InferenceTest3 extends Application { def id[T](x T) = x val p = new MyPair(1, "scala") // 型 MyPair[Int, String] val q = id(1) // 型 Int } 上記プログラムの最後の 2 行は、推論された型をすべて明示した、次のコードに等価です val x MyPair[Int, String] = new MyPair[Int, String](1, "scala") val y Int = id[Int](1) ある状況では、次のプログラムが示すように、Scala の型推論機構に頼ることは非常に危険です。 object InferenceTest4 { var obj = null obj = new Object() } このプログラムはコンパイルできません。なぜなら、変数 obj の推論される型は Null だからです。この型の唯一の値は nullですから、この変数に他の値を参照させることはできません。 Scala ひと巡り 統合された型 (Unified Types) 原ページ Java と異なり、Scala ではすべての値はオブジェクトです(数値や関数を含めて)。Scala はクラスを基盤にしているので、すべての値はクラスのインスタンスです。下図は Scala のクラス階層を示しています。 imageプラグインエラー ご指定のURLはサポートしていません。png, jpg, gif などの画像URLを指定してください。 Scala クラス階層 全てのクラスのスーパークラスである scala.Any は直下にサブクラス scala.AnyValue と AnyRef を持っています。それらは 2 つの異なるクラスの系統 値クラスと参照クラスを代表しています。すべての値クラスは事前定義されています;それらは Java ライクな言語のプリミティブ型に対応します。他のすべてのクラスは参照型を定義します。ユーザー定義のクラスは、デフォルトでは参照型を定義します; つまり、それらはいつも(間接的に)scala.AnyRef のサブクラスとなります。Scala のユーザー定義クラスはすべて、暗黙のうちにトレイト scala.ScalaObject を拡張(継承)します。Scala 実行基盤からのクラス(つまり Java 実行時環境)は、scala.ScalaObject を拡張しません。もし Scala を Java 実行時環境のコンテキスト中で使うなら、scala.AnyRef は java.lang.Object に対応します。 上図は、値クラス間のビュー [24]と呼ばれる暗黙の型変換も示していることに注意してください。 次の例は、数、文字、論理値等と関数の双方とも、他のオブジェクトとまったく同じく、オブジェクトであることを示しています。 object UnifiedTypes { def main(args Array[String]) { val set = new scala.collection.mutable.HashSet[Any] set += "This is a string" // 文字列の追加 set += 732 // 数の追加 set += c // 文字の追加 set += true // 論理値の追加 set += main _ // main 関数の追加 val iter Iterator[Any] = set.elements while (iter.hasNext) { println(iter.next.toString()) } } } プログラムは、トップレベルのシングルトンオブジェクトの形で、main メソッドをもつアプリケーション UnifiedTypes を宣言します。main メソッドは、クラス HashSet[Any]のインスタンスを参照するローカル変数 set を定義します。プログラムはこの set に様々な要素を加えます。要素は、宣言されたセット要素型 Any に適合しなければなりません。最後に、すべての要素の文字列表現を印字します。 次はプログラムの出力です c true function 732 This is a string Scala ひと巡り 変位指定 (Variances) 原ページ Scala は、ジェネリッククラスの型パラメータ [16]の変位指定アノテーションをサポートします。Java5 (aka.JDK 1.5[58])と対照して、クラス抽象を定義するときに変位指定アノテーションを加えることができます。他方、Java5 では、変位指定アノテーションはクラス抽象を使うときにクライアントが与えます。(訳注:Scalaでは静的に表現できるということ) ジェネリッククラスについてのページに、ミュータブル(更新可能)なスタックの例がありました。クラス Stack[T] によって定義された型は、型パラメータについて非変のサブ型付けになると説明しました。それによりクラス抽象の再利用を制限できます。今度はこの制限を持たないスタックの関数型(つまり、イミュータブル(更新不可)な)実装を導きます。これが、明白ではない方法で多相的メソッド [25]、下限型境界 [19]、そして共変の型パラメータアノテーションの使用を結びつける、進んだ例であることに注意してください。さらにまた、スタック要素を明示的なリンクなしでチェインするために、内部クラス [20]を利用します。 class Stack[+A] { def push[B A](elem B) Stack[B] = new Stack[B] { override def top B = elem override def pop Stack[B] = Stack.this override def toString() = elem.toString() + " " + Stack.this.toString() } def top A = error("no element on stack") def pop Stack[A] = error("no element on stack") override def toString() = "" } object VariancesTest extends Application { var s Stack[Any] = new Stack().push("hello"); s = s.push(new Object()) s = s.push(7) Console.println(s) } アノテーション +T は、型 T が共変の位置でだけ使われると宣言します。同様に、-T は、T が反変の位置でだけ使われると宣言します。共変の型パラメータなので、この型パラメータについて共変のサブ型関係を得ます。この例では、もし T が S のサブ型なら、このことは、Stack[T] が Stack[S]のサブ型であることを意味します。 - とタグ付けられた型パラメータについては、反対のことが当てはまります。スタックの例では、メソッド push を定義できるようにするために、反変の位置で共変型パラメータ T を使う必要があります。スタックは共変のサブ型付けにしたいのですから、トリックを使います。メソッド push のパラメータ型上で抽象化します。push の型変数の下限境界として要素型 T を使う多相的メソッド [25]を得ます。これには、その共変型パラメータとしての宣言と協調する T の変位指定を持ち込む効果があります。今、スタックは共変です。しかしこのソリューションによれば、たとえば、整数スタック上に文字列をプッシュすることが可能となります。戻り値は型 Stack[Any] のスタックです。;整数スタックを期待するコンテキスト中で戻り値を使う場合にだけ、実際にエラーを検出します。そうでない場合、より汎用的な要素型のスタックを得ます。 Scala ひと巡り ビュー (Views) 原ページ 暗黙のパラメータ [63]とメソッドは、ビューと呼ばれる暗黙の型変換も定義できます。型 S から型 T へのビューは、関数型 S = T を持つ暗黙の値によって、あるいは、その型の値に変換可能なメソッドによって定義されます。 ビューは 2 つの状況で適用されます 式 e が型 T で、T が式の要請型(期待される型) pt に適合しないとき 型 T の e の選択 e.m 中で、セレクタ m が T のメンバーを意味しないとき 最初の場合は、 e に適用可能でその結果型が pt に適合するビュー v が検索されます。2 番目の場合は、e に適用可能でその結果型が m という名前のメンバーを含むビュー v が検索されます。 型 List[Int]の 2 つのリスト xs と ys 上の、次の操作は正しいです。 xs = ys ただし、下記で定義された 暗黙のメソッド list2ordered と int2ordered がスコープ中にあると仮定して implicit def list2ordered[A](x List[A]) (implicit elem2ordered a = Ordered[A]) Ordered[List[A]] = new Ordered[List[A]] { /* .. */ } implicit def int2ordered(x Int) Ordered[Int] = new Ordered[Int] { /* .. */ } list2ordered 関数は、型パラメータの可視境界(view bound:ビュー境界)を使っても表現できます implicit def list2ordered[A % Ordered[A]](x List[A]) Ordered[List[A]] = ... Scala コンパイラはこのとき、上記で与えられた list2ordered の定義に等価なコードを生成します。 暗黙のうちにインポートされる [64] オブジェクト scala.Predef は、いくつかの事前定義された型(たとえば Pair)とメソッド(たとえば error)ばかりでなく、いくつかのビューも宣言します。次の例は、事前定義されたビュー charWrapper のアイデアを示します final class RichChar(c Char) { def isDigit Boolean = Character.isDigit(c) // isLetter, isWhitespace, etc. } object RichCharTest { implicit def charWrapper(c char) = new RichChar(c) def main(args Array[String]) { println( 0 .isDigit) } } Scala ひと巡り XML 処理 (XML Processing) 原ページ Scala を使えば、XML ドキュメントの生成、解析、処理が簡単に行えます。Scala では、XML データをジェネリックなデータ表現を使うことであるいは、データに特化したデータ表現を用いて表現できます。後者の方法は、データ結合ツール schema2src によってサポートされます。 実行時表現 XML データはラベル付きのツリーとして表現されます。Scala 1.2から始まり(以前のバージョンでは -Xmarkup オプションを使う必要があります)、そのようなラベル付きノードを標準的な XML 構文を使って簡単に生成できます。 次の XML ドキュメントについて考えます。 html head title Hello XHTML world /title /head body h1 Hello world /h1 p a href="http //scala-lang.org/" Scala /a talks XHTML /p /body /html このドキュメントは、次の Scala プログラムで生成できます。 object XMLTest1 extends Application { val page = html head title Hello XHTML world /title /head body h1 Hello world /h1 p a href="scala-lang.org" Scala /a talks XHTML /p /body /html ; println(page.toString()) } Scala 式と XML をミックスできます。 object XMLTest2 extends Application { import scala.xml._ val df = java.text.DateFormat.getDateInstance() val dateString = df.format(new java.util.Date()) def theDate(name String) = dateMsg addressedTo={ name } Hello, { name }! Today is { dateString } /dateMsg ; println(theDate("John Doe").toString()) } データの結合 多くの場合、人は処理したい XML ドキュメントに関する DTD を持っています。そのための特別な Scala クラスを生成し、XML を解析し保存するためのコードがほしいことでしょう。Scala は、DTD を Scalaクラス定義 のコレクションに変えるといったことをあなたに代わって全部やってくれる、気のきいたツールになります。 schema2src ツールを使った文書化と例は、Burak のドラフト Scala xml book [65] にあることを書き留めておきます。 前 はじめ
https://w.atwiki.jp/subeta/pages/99.html
Aeanoid Antlephore Anyu Archan Bovyne Bumbus Cadogre Celinox Chai Charlie Chelon Clawsion Cybill Darkonite Demi Devonti Dillema Donadak Dragarth Endeavor Escalade Feli Fester Ghostly Harvester Hikei Hipottu Illumis Irion Jollin Kanis Keeto Kerubi Kora Kumos Lain Lasirus Legeica Magnus Mahar Mallarchy Malticorn Manchu Montre Mortking Ontra Paralix Pherret Popoko Priggle Rreign Ruffie Serpenth Sheeta Swampie Telenine Terracoon Tigrean Torrent Torrey Tutani Velosotor Warador Wyllop
https://w.atwiki.jp/tmiya/pages/127.html
Scala ひと巡り ジェネリッククラス (Generic Classes) 原ページ Java 5 (aka.JDK 1.5 [58])と同じように、Scala は、型がパラメータ化されたクラスを組み込でサポートしています。そのようなジェネリッククラスは、コレクションクラスの開発に特に役立ちます。 次はこのことを示す例です class Stack[T] { var elems List[T] = Nil def push(x T) { elems = x elems } def top T = elems.head def pop() { elems = elems.tail } } クラス Stack は、任意の要素型 T の命令型(ミュータブル 更新可能な)スタックをモデル化します。型パラメータの使用により、正しい要素(つまり型が T のもの)だけがスタック上に push されるようにできます。同様に、型パラメータを用いてメソッド top が、与えられた型の要素だけを出力することを表現できます。 次は使用方法を示すいくつかの例です object GenericsTest extends Application { val stack = new Stack[Int] stack.push(1) stack.push( a ) println(stack.top) stack.pop() println(stack.top) } 次は、このプログラムの出力です。 97 1 ジェネリック型のサブ型付けは、非変であることに注意してください。これは、もし型 Stack[Char] の文字スタックがあっても、それを型 Stack[Int] の整数スタックとしては使えないことを意味します。それでは、本当の整数を文字スタックに入れることがでてしまうので、不健全でしょう。結論を言えば、ただ S = T の場合に限り、Stack[T] は Stack[S] のサブ型になります。これは非常に制約が厳しいので、Scala は、ジェネリック型のサブ型付けの振る舞いをコントロールする、型パラメータのアノテーション機構 [17]を提供しています。 Scala ひと巡り 暗黙のパラメータ (Implicit Parameters) 原ページ 暗黙のパラメータをもつメソッドは、通常のメソッドとまったく同じように引数に適用されます。この場合、implicit ラベルは効果を持ちません。しかし、もしメソッドにその暗黙のパラメータに対する引数が書かれていないなら、そのような引数は自動的に供給されます。 暗黙のパラメータに渡すに適した実際の引数は、2 つのカテゴリに分けられます。 1 つめは、メソッド呼び出しの時点でアクセスできる、前置子のつかない、implicit 定義あるいは暗黙のパラメータを表す、すべての識別子 x が適しています。 2 つめは、implicit と印された暗黙のパラメータの型のコンパニオンモジュールのすべてのメンバーも適しています。 次の例は、monoid の add と unit 操作を使ってリストの要素の合計を計算する、メソッド sum を定義しています。暗黙の値がトップレベルではいけないことに注意してください。それらはテンプレートのメンバーでなければなりません。 abstract class SemiGroup[A] { def add(x A, y A) A } abstract class Monoid[A] extends SemiGroup[A] { def unit A } object ImplicitTest extends Application { implicit object StringMonoid extends Monoid[String] { def add(x String, y String) String = x concat y def unit String = "" } implicit object IntMonoid extends Monoid[Int] { def add(x Int, y Int) Int = x + y def unit Int = 0 } def sum[A](xs List[A])(implicit m Monoid[A]) A = if (xs.isEmpty) m.unit else m.add(xs.head, sum(xs.tail)) println(sum(List(1, 2, 3))) println(sum(List("a", "b", "c"))) } 次は Scala プログラムの出力です 6 abc Scala ひと巡り 内部クラス (Inner Classes) 原ページ Scala では、クラスは他のクラスをメンバーとして持てます。Java ライクな言語では、そのような内部クラスは取り囲むクラスのメンバーですが、Scala では反対に、そのような内部クラスは外側のオブジェクトへ束縛されます。違いを明らかにするために、グラフデータ型の実装概要を示します class Graph { class Node { var connectedNodes List[Node] = Nil def connectTo(node Node) { if (connectedNodes.find(node.equals).isEmpty) { connectedNodes = node connectedNodes } } } var nodes List[Node] = Nil def newNode Node = { val res = new Node nodes = res nodes res } } このプログラムで、グラフはノードのリストによって表されます。ノードは内部クラス Node のオブジェクトです。各ノードは 隣のリストを持っており、それはリスト connectedNodes 中に記憶されます。これでいくつかのノードをもち、ノードを付加的に(incrementally)連結できるグラフをセットアップできます。 object GraphTest extends Application { val g = new Graph val n1 = g.newNode val n2 = g.newNode val n3 = g.newNode n1.connectTo(n2) n3.connectTo(n1) } 次に、定義されるエンティティの型が何であるかを明示する型を用いて、例を補強します object GraphTest extends Application { val g Graph = new Graph val n1 g.Node = g.newNode val n2 g.Node = g.newNode val n3 g.Node = g.newNode n1.connectTo(n2) n3.connectTo(n1) } このコードは、ノードの型が、その外側のインスタンス(この例ではオブジェクト g )で前置されることを明らかにしています。今 2 つのグラフがあるとして、Scala の型システムは、一方のグラフ内で定義されたノードと他方のグラフのノードを混ぜることを許しません。なぜなら、他のグラフのノードは異なる型をもつからです。 次は不正なプログラムです object IllegalGraphTest extends Application { val g Graph = new Graph val n1 g.Node = g.newNode val n2 g.Node = g.newNode n1.connectTo(n2) // 正しい val h Graph = new Graph val n3 h.Node = h.newNode n1.connectTo(n3) // 不正! } Javaでは、上記サンプルプログラムの最後の行は正しいことに注意してください。Java は両方のグラフのノードに同じ型 Graph.Node を割り当てます。すなわち、Node はクラス Graph で前置されます(*1)。 Scalaでは、そのような型も表現でき、Graph#Node と書きます。もし異なるグラフのノードを連結できるようにしたければ、最初のグラフ実装の定義を次のように変える必要があります。 class Graph { class Node { var connectedNodes List[Graph#Node] = Nil def connectTo(node Graph#Node) { if (connectedNodes.find(node.equals).isEmpty) { connectedNodes = node connectedNodes } } } var nodes List[Node] = Nil def newNode Node = { val res = new Node nodes = res nodes res } } このプログラムが、2 つの異なるグラフへのノードの張りつけを許さないことに注意してください。もしこの制限もなくしたければ、変数 nodes の型とメソッド newNode の戻り値型を Graph#Node に変える必要があります。 (*1)訳注: Scalaではクラス Graph ではなくオブジェクト g が前置されていて、 g.Node と h.Node はパスが異なるので異なる型を表すということ。 Scala ひと巡り ミックスインクラス合成 (Mixin Class Composition) 原ページ 単一継承のみをサポートする言語と対照して、Scala には、クラス再利用のためのより汎用的な概念があります。Scala では、クラスの新しいメンバー定義(すなわち、スーパークラス継承の差分)を再利用できます。これはミックスインクラス合成として表現されます。イテレータに関する次の抽象化を考えてみます。 abstract class AbsIterator { type T def hasNext Boolean def next T } 次に、メソッド foreach を用いて AbsIterator を展開するミックスインクラスについて考えます。ここで foreach は、イテレータが返す各要素に与えられた関数を適用します。ミックスインとして使用できるクラスを定義するのに、キーワード trait を使います。 trait RichIterator extends AbsIterator { def foreach(f T = Unit) { while (hasNext) f(next) } } 次は、与えられた文字列の文字を次々に返す、具象イテレータクラスです class StringIterator(s String) extends AbsIterator { type T = Char private var i = 0 def hasNext = i s.length() def next = { val ch = s charAt i; i += 1; ch } } StringIterator と RichIterator の機能を 1 つのクラスへ統合したいとします。これは単一継承とインタフェースだけではできません。両クラスともコードを伴うメンバー実装を含むからです。Scala では、ミックスインクラス合成を使ってできます。プログラマはクラス定義の差分 --- すなわち、継承さていれないすべての新しい定義 --- を再利用できます。この機構により、次のテストプログラムのようにして、RichIterator と StringIterator を統合できます。次は、与えられた文字列のすべての文字のカラムを印字します。 object StringIteratorTest { def main(args Array[String]) { class Iter extends StringIterator(args(0)) with RichIterator val iter = new Iter iter foreach println } } 関数 main 中の Iter クラスは、親の StringIterator と RichIterator をキーワード with を使ってミックスイン合成し、構築されています。最初の親は Iter のスーパークラスと呼ばれるのに対し、2 つめ(と、もしあればその他すべて)の親は、ミックスインと呼ばれます。 Scala ひと巡り 関数のネスト (Nested Functions) 原ページ Scala では、関数定義をネストできます。次のオブジェクトは、整数のリストから閾値未満の値を抽出する、filter 関数を提供します object FilterTest extends Application { def filter(xs List[Int], threshold Int) = { def process(ys List[Int]) List[Int] = if (ys.isEmpty) ys else if (ys.head threshold) ys.head process(ys.tail) else process(ys.tail) process(xs) } println(filter(List(1, 9, 2, 8, 3, 7, 4), 5)) } ネストされた関数 process が、filter のパラメータ値である外側のスコープ中で定義された変数 threshold を参照することに注意してください。 次はこのプログラムの出力です List(1,2,3,4) Scala ひと巡り 無名関数の構文 (Anonymous Function Syntax) 原ページ Scala は無名関数の定義について、比較的簡単な構文を提供します。次の式は、整数の後続関数を生成します (x Int) = x + 1 これは次の、無名クラス定義の略記表現です new Function1[Int, Int] { def apply(x Int) Int = x + 1 } 複数のパラメータをもつ関数も定義できます。 (x Int, y Int) = "(" + x + ", " + y + ")" あるいは、パラメータなしの関数 () = { System.getProperty("user.dir") } 関数の型を書くためのたいへん簡単な方法もあります。次は、上で定義した 3 つの関数の型です Int = Int (Int, Int) = String () = String この構文は、次の型の略記表現です Function1[Int, Int] Function2[Int, Int, String] Function0[String] Scala ひと巡り カリー化 (Currying) 原ページ メソッドは複数のパラメータリストを定義できます。メソッドは、パラメータリストの数より少ない形で呼び出される時には、その引数としてパラメータリストを失った関数をもたらします。 次は 1 つの例です object CurryTest extends Application { def filter(xs List[Int], p Int = Boolean) List[Int] = if (xs.isEmpty) xs else if (p(xs.head)) xs.head filter(xs.tail, p) else filter(xs.tail, p) def modN(n Int)(x Int) = ((x % n) == 0) val nums = List(1, 2, 3, 4, 5, 6, 7, 8) println(filter(nums, modN(2))) println(filter(nums, modN(3))) } 2 つの filter 呼び出しにおいて、メソッド modN が部分適用されることに注意してください; すなわち、その最初の引数だけが実際に適用されます。項 modN(2) は、型 Int = Boolean の関数をもたらし、それはこのように、関数 filter の 2 番目の引数に対する可能な候補となります。 次は、上記プログラムの出力です List(2,4,6,8) List(3,6) Scala ひと巡り 型依存クロージャの自動構築 (Automatic Type-Dependent Closure Construction) 原ページ uction) Scala では、メソッドのパラメータにパラメータなしの関数名を与えることができます。そのようなメソッドが呼ばれる時、パラメータなしの関数名に対する実際のパラメータは評価されず、代わりにパラメータなしの関数が渡されます。これは対応するパラメータの計算をカプセル化します(いわゆる、名前呼出し評価)。 次のコードはこのメカニズムを示します object TargetTest1 extends Application { def whileLoop(cond = Boolean)(body = Unit) Unit = if (cond) { body whileLoop(cond)(body) } var i = 10 whileLoop (i 0) { println(i) i -= 1 } } 関数 whileLoop は、2 つのパラメータ cond と body をとります。関数の適用時、実際のパラメータは評価されません。しかしその代わりに、whileLoop の本体中で形式上のパラメータが使われる毎に、暗黙のうちに生成されるパラメータなしの関数が評価されます。このように、このメソッド whileLoop は、再帰的な実装方式の Java ライクな while-loop を実装します。 中置/後置演算子 [27] とこのメカニズムを結びつけて、(洗練された構文を用いた)より複雑な文を作れます。 次は loop-unless 文の実装です object TargetTest2 extends Application { def loop(body = Unit) LoopUnlessCond = new LoopUnlessCond(body) protected class LoopUnlessCond(body = Unit) { def unless(cond = Boolean) { body if (!cond) unless(cond) } } var i = 10 loop { println("i = " + i) i -= 1 } unless (i == 0) } loop 関数はただループの本体を受けつけるだけであり、そして(この本体オブジェクトをカプセル化する)クラス LoopUnlessCond のインスタンスを返します。本体がまだ評価されないことに注意してください。クラス LoopUnlessCond はメソッド unless を持っており、それを中置演算子として使用できます。このように、新たなループ loop { stats } unless ( cond ) の、極めて自然な構文を作れます 次は、TargetTest2 を実行したときの出力です i = 10 i = 9 i = 8 i = 7 i = 6 i = 5 i = 4 i = 3 i = 2 i = 1 Scala ひと巡り オペレータ (Operators) 原ページ Scala では、ただ 1 つのパラメータをとるどのようなメソッドも中置演算子として使えます。 次は、3 つのメソッド and、or と negate を定義する classMyBool の定義です。 class MyBool(x Boolean) { def and(that MyBool) MyBool = if (x) that else this def or(that MyBool) MyBool = if (x) this else that def negate MyBool = new MyBool(!x) } ここで、and と or を中置演算子として使えます。 def not(x MyBool) = x negate; // ここではセミコロンが必要 def xor(x MyBool, y MyBool) = (x or y) and not(x and y) このコードの最初の行のように、パラメータなしのメソッドを後置演算子としても使用えます。2 番目の行は、新しい not 関数と同様に、and および or メソッドを使って xor 関数を定義します。この例で、中置演算子を使って xor 定義がいっそう理解しやすくなっています。 次は、より伝統的なオブジェクト指向プログラミング言語構文における、対応するコードです def not(x MyBool) = x.negate; // semicolon required here def xor(x MyBool, y MyBool) = x.or(y).and(x.and(y).negate) Scala ひと巡り 高階関数 (Higher-Order Functions) 原ページ Scala では、高階関数を定義できます。それらは、パラメータに他の関数をとるか、あるいは、その結果が関数であるような、関数です。 次は、他の関数 f と値 v をとり、関数 f を v に適用する、関数 apply です。 def apply(f Int = String, v Int) = f(v) もしコンテキスト上で必要なら、メソッドが関数へ自動的に特化(coerced 強制)されることに注意してください。 次は 1 つの例です class Decorator(left String, right String) { def layout[A](x A) = left + x.toString() + right } object FunTest extends Application { def apply(f Int = String, v Int) = f(v) val decorator = new Decorator("[", "]") println(apply(decorator.layout, 7)) } 実行すると次の出力となります。 [7] この例で、メソッド decorator.layout は、メソッド apply が必要とするときに、型 Int = String の値へ自動的に特化されます。メソッド decorator.layout が多相的メソッドであり(すなわち、いくつかのシグニチャ型にわたっての抽象化)、Scala コンパイラは最初にそのメソッド型を適切にインスタンス化しなければならないことに注意してください。 Scala ひと巡り パッケージ (Packages) 原ページ パッケージはメンバークラス、オブジェクトとパッケージの集合を定義する特別なオブジェクトです。他のオブジェクトと異なり、パッケージは定義では導入できません。 パッケージング package p { ds } は、ds 中のすべての定義をその限定修飾名が p であるパッケージに、メンバーとして注入します。パッケージのメンバーはトップレベル定義と呼ばれます。もし ds 中の定義が private と印されていれば、そのパッケージ中の他のメンバーに対してのみ可視となります。 protected 修飾子をパッケージ識別子 p で限定できます(たとえば protected[p])。そのような修飾子を印されたメンバーは、パッケージ p 内のすべてのコードから同様にアクセス可能です。 p からの選択 p.m は、p からのインポートと同様、オブジェクトに関して機能します。しかし、他のオブジェクトと異なり、パッケージは値としては使用できません。モジュールあるいはクラス名と、同じ完全修飾名のパッケージは不正です。 パッケージング外でのトップレベル定義は、特別な空パッケージに注入されるとみなされます。このパッケージは、名前を付けることはできず、したがってインポートできません。しかし、空パッケージのメンバーは互いに限定修飾なしで可視です。 パッケージ節ではじまるコンパイル単位 package p ; stats は、ただ 1 つのパッケージング package p { stats } からなるコンパイル単位と同じです。 同じ Scala ソースファイル中で、複数のパッケージを宣言できます。 package p1 { object test extends Application { println("p1.test") } } package p2 { object test extends Application { println("p2.test") } } インポート節 インポート節は、import p.I の形をしています。ここで、インポート式 I は、限定修飾なしでアクセスできる、p のインポート可能なメンバー名の集合を決定します。たとえば 節 限定修飾なしで利用可能 import p._ p の全てのメンバー (Javaにおける import p.* と類似) import p.x p のメンバー x import p.{x = a} p のメンバー x を a にリネーム import p.{x, y} p のメンバー x と y import p1.p2.z p2 のメンバー z 。p2 自身は p1 のメンバー また、節 import p1._ , p2._ は、import p1._; import p2._ の略記表現です。 次は、すべてのコンパイル単位中に暗黙のうちに、この順番でインポートされます。 パッケージ java.lang、 パッケージ Scala と オブジェクト scala.Predef この順番において、後でインポートしたメンバーは、前にインポートしたメンバーを隠します。 Scala ひと巡り パターンマッチング (Pattern Matching) 原ページ Scala には、汎用的なパターンマッチング機構が組み込まれています。ファーストマッチ方式で、あらゆる種類のデータ上でマッチングさせることができます。 次は、整数値に対するマッチ方法を示す、小さな例です object MatchTest1 extends Application { def matchTest(x Int) String = x match { case 1 = "one" case 2 = "two" case _ = "many" } println(matchTest(3)) } ケース文のブロックは、整数を文字列にマップする関数を定義します。match キーワードは、オブジェクトに関数を適用する(上記のパターンマッチング関数のような)便利な方法を提供します。 次は、異なる型のパターンの値とマッチする、2 つめの例です object MatchTest2 extends Application { def matchTest(x Any) Any = x match { case 1 = "one" case "two" = 2 case y Int = "scala.Int" } println(matchTest("two")) } もし x が整数値 1 を参照するなら、最初のケースがマッチします。もし x が文字列 "two" と等しければ、2 つめのケースがマッチします。3 つめのケースは型付きパターンから成ります; それは任意の整数にマッチし、セレクター値 x を整数型の変数 y に束縛します。 Scala のパターンマッチング文は、ケースクラス [10]を介して表現される代数型上のマッチングにおいて、最も役に立ちます。 Scala ではまた、抽出子オブジェクト [59]中の unapply メソッドを使って、ケースクラスとは独立にパターンを定義できます。 Scala ひと巡り 多相的メソッド (Polymorphic Methods) 原ページ Scala 中のメソッドは、値と型の両方でパラメータ化できます。クラスレベルのように、値パラメータは丸括弧の対で囲み、他方、型パラメータは対の角括弧内で宣言します。 次は 1 つの例です object PolyTest extends Application { def dup[T](x T, n Int) List[T] = if (n == 0) Nil else x dup(x, n - 1) println(dup[Int](3, 4)) println(dup("three", 3)) } オブジェクト PolyTest 中のメソッド dup は、型 T と値パラメータ x T、n Int でパラメータ化されています。メソッド dup が呼び出されると、プログラマは必要とされるパラメータを提供しますが(上記プログラム中の 5 行目参照)、上記プログラムの 6 行目のように、プログラマは実際の型パラメータを明示的に与える必要はありません。Scala の型システムは、そのような型を推論できます。それは、与えられた値パラメータの型と、メソッドが呼ばれるコンテキストを調べることで、なされます。 トレイト Application は短いテストプログラムを書くために設計したのですが、JVM の出力コード最適化能力を動揺させるようなプログラムを書くことは避けるべきでしょう。この代わりに def main() を使ってください。 Scala ひと巡り 正規表現パターン (Regular Expression Patterns) 原ページ 右無視シーケンスパターン 右無視パターンは、Seq[A]のサブ型あるいは、(たとえば下記のような)反復する形式上のパラメータをもつケースクラスなどのデータ分解に役立つフィーチャーです。 Elem(prefix String, label String, attrs MetaData, scp NamespaceBinding, children Node*) これらの場合、Scala は、任意長のシーケンスを表すワイルドカード-星印 _ * を最右端にもつパターンを許しています。 次は、シーケンスの前部とマッチし、残りを変数 restへ束縛する、パターンマッチの例です。 object RegExpTest1 extends Application { def containsScala(x String) Boolean = { val z Seq[Char] = x z match { case Seq( s , c , a , l , a , rest @ _*) = println("rest is "+rest) true case Seq(_*) = false } } } 次に述べる理由により、前 Scala バージョンと違い、もう任意の正規表現は使用できません。 Scala から当面の間除かれた一般的な Regexp パターン 正当性の問題が見つかり、このフィーチャーは当面の間 Scala 言語から除かれています。もしユーザーコミュニティーからのリクエストがあれば、私たちはこれを改善した形で復活させるかもしれません。 私達の考えでは、正規表現パターンは私たちが見積もったほどには XML 処理に役立ちませんでした。現実の XML 処理アプリケーションでは、XPath ははるかに良い選択肢に思われます。変換処理あるいは正規表現パターンが、あまり使われずしかも取り除くことが難しい難解なパターンに対していくつかのバグをもつということを見つけたとき、言語を単純化する時が来たと私達は判断しました。 前 はじめ 次
https://w.atwiki.jp/radis/pages/16.html
Scalaでクイックソート def qsort(a List[Int]) List[Int] = a match{ case Nil = Nil case x xs = { val smaller = xs.filter(_ = x) val larger = xs.filter(_ x) qsort(smaller) (x qsort(larger)) } } 乱数を生成してソート qsort((for (i - 1 to 100) yield scala.util.Random.nextInt(100)) toList) 標準関数でソート List(1,5,7,2,10,4) sortWith(_ _) ランダムな文字列 (for (i -1 to 10) yield scala.util.Random.nextPrintableChar) mkString バイト配列を作成してfloatの値などを書き込む import java.nio.{ByteBuffer,ByteOrder} val ba = new Array[Byte](100) val wb = ByteBuffer.wrap(ba) wb.order(ByteOrder.LITTLE_ENDIAN) wb.putFloat(3.1415F) wb.putInt(1) ファイルにfloatの値を書き込む import java.io._ val f = new FileOutputStream("testfile") val d = new DataOutputStram(f) d.writeFloat(3.1415F) d.close ファイルからfloatの値を読み込む import java.io._ val f = new FileInputStream("testfile") val d = new DataInputStream(f) val data = d2.readFloat ファイルをすべて読み込みバイト配列に収容 import java.io._ val f = new FileInputStream("samplefile.v") val bytes = new Array[Byte](f.available) //f.availableはファイルサイズを返す。 new BufferedInputStream(f).read(bytes) f.close バイト配列からファイルを作成 import java.io._ val a = Array[Byte](1,3,5,7,9) val f = new FileOutputStream("testfile.bin") f.write(a) f.close floatの値を等価のint(4バイト)に変換、またその逆 import java.lang._ val i = Float.floatToIntBits(3.1415F) val f = Float.intBitsToFloat(i) 親配列[Byte]の位置nからの順列が、子配列[Byte]と一致するかどうかを調べる。 def commonSeq2(p Array[Byte], c Array[Byte], n Int) = (0 to c.length-1) forall(i = p(n+i) == c(i)) 素数かどうかの判定 def isPrime(i Int) = i match { case 1 = false case 2 = true case _ = (2 to math.sqrt(i).toInt+1).forall(i % _ != 0) } 1から1000までの素数を求める (1 to 1000) filter(isPrime) 16進数表示 printf("%02x",255) 時刻を表す文字列をparseする import java.text.SimpleDateFormat val df = new SimpleDateFormat("yyyy/MM/dd HH mm ss") println(df.parse("2011/06/20 15 24 59"))
https://w.atwiki.jp/hotslide/pages/10.html
ステータス早見表 ※ 赤字はこのレア度内での最大数値を示す ※2 「Lv MAX時」の数値 車名 加速度 最大時速 アクセルゲージ [特] Minni 238 216 7 [オ] Agent 254 190 8 [オ] Roamer 257 180 7 [オ] Safari 246 179 8 [改] Neon 240 212 6 [改] Polluter 248 209 5 [改] Tofu 246 203 5 [マ] Atomic 225 245 6 [マ] Taxi 229 248 6 [マ] Tow Truck 224 240 7 ※以下、画像スライドで別スキン表示 Minni タイプ アクセルゲージ【特殊車】 7 モデル車:[BMW]ROVER MINI Agent タイプ アクセルゲージ【オフローダー】 8 モデル車:[CADILLAC]ESCALADE Roamer タイプ アクセルゲージ【オフローダー】 7 モデル車 Safari タイプ アクセルゲージ【オフローダー】 8 モデル車:[Jeep]WRANGLER Neon タイプ アクセルゲージ【改装車】 6 モデル車 [SUBARU]WRX Polluter タイプ アクセルゲージ【改装車】 5 モデル車 [PEUGEOT]206 Tofu タイプ アクセルゲージ【改装車】 6 モデル車:[TOYOTA]AE86 TRUENO モデル作品:「頭文字D」藤原 拓海 搭乗車 Atomic タイプ アクセルゲージ【マッスルカー】 6 モデル車:[CADILLAC]Eldorado モデル作品:「ピンク・キャデラック」 Taxi タイプ アクセルゲージ【マッスルカー】 6 モデル車:[Ford]Yellow Cab(ニューヨークのタクシー会社) Tow Truck タイプ アクセルゲージ【マッスルカー】 7 モデル車:
https://w.atwiki.jp/tmiya/pages/126.html
Scala ひと巡り 抽象型 (Abstract Types) 原ページ Scala では、クラスは値(コンストラクタ・パラメータ)と(もしクラスがジェネリック [16]なら)型でパラメータ化されます。単に規則に従って、オブジェクトメンバーとして値を持てるというばかりではありません; 値と同様に、型はオブジェクトのメンバーです。さらに、メンバーの両形式とも、具象あるいは抽象で構いません。 次の例は、クラス Buffer のメンバーとして、延期された値定義と抽象型定義の両方を定義しています。 abstract class Buffer { type T val element T } 抽象型はその正体が正確には知られていない型です。上記の例で、我々は、クラス Buffer の各オブジェクトが 型メンバー T を持つことだけを知っています。しかしクラス Buffer の定義は、メンバー型 T がどのような具象(具体的な)型に対応するのかを明らかにしません。値定義と同じように、サブクラス中で型定義をオーバライドできます。これにより、(可能な、抽象型の具象インスタンス化を記述する)型境界を厳しくすることで、抽象型についてより多くの情報を明らかにできます。 次のプログラムで、型 T が新しい抽象型 U のサブ型でなければならないと述べることで、バッファ中にシーケンスのみを記憶できるクラス SeqBuffer を得ます abstract class SeqBuffer extends Buffer { type U type T Seq[U] def length = element.length } 抽象型メンバーをもつトレイトあるいはクラス [2]は、無名クラスのインスタンス化との組合せでしばしば使われます。この例として、整数リストを参照するシーケンスバッファを扱う、次のプログラムを見てみます。 abstract class IntSeqBuffer extends SeqBuffer { type U = Int } object AbstractTypeTest1 extends Application { def newIntSeqBuf(elem1 Int, elem2 Int) IntSeqBuffer = new IntSeqBuffer { type T = List[U] val element = List(elem1, elem2) } val buf = newIntSeqBuf(7, 8) println("length = " + buf.length) println("content = " + buf.element) } メソッド newIntSeqBuf の戻り値型は、型 U が toInt に等しい、トレイト Buffer の特化を参照します。メソッド newIntSeqBuf 本体内における無名クラスのインスタンス化で、似たような型エイリアスを使っています。そこでは、型 T が List[Int]を参照する、IntSeqBuffer の新しいインスタンスを生成します。 抽象型メンバーをクラスの型パラメータに変えることや、その逆も可能であることに注意してください。次は、上記コードの型パラメータだけを使うバージョンです abstract class Buffer[+T] { val element T } abstract class SeqBuffer[U, +T Seq[U]] extends Buffer[T] { def length = element.length } object AbstractTypeTest2 extends Application { def newIntSeqBuf(e1 Int, e2 Int) SeqBuffer[Int, Seq[Int]] = new SeqBuffer[Int, List[Int]] { val element = List(e1, e2) } val buf = newIntSeqBuf(7, 8) println("length = " + buf.length) println("content = " + buf.element) } ここでは変位指定アノテーション [17]を使う必要があることに注意してください; そうでなければ、メソッド newIntSeqBuf が返すオブジェクトの具象シーケンス実装型を隠せなくなります。さらにまた、型パラメータを抽象型で置き換えできない場合があります。 Scala ひと巡り アノテーション (Annotations) 原ページ アノテーションは、定義にメタ情報を関連づけます。 単純なアノテーション節は、@C あるいは @C(a1,...,an) の形です。ここで、C はクラス C のコンストラクタで、scala.Annotation [31]に適合しなくてはなりません。 All given constructor_arguments a1,...,an must be constant_expressions (i.e., expressions on numeral literals, strings, class_literals, Java enumerations and one-dimensional arrays of them) . 与えられたコンストラクタ引数 a1,...,an はすべて、定数式(すなわち、数値リテラル、文字列、クラスリテラル、Java enumとそれらの 1 次元配列上の式)でなければなりません。 アノテーション節は、その後に続く、最初の定義または宣言に適用されます。1 つ以上のアノテーション節が定義や宣言に先行するかもしれません。それら節の与えられた順番は重要ではありません。 アノテーション節の意味は処理系依存です。Java プラットフォームでは、次の Scala アノテーションは標準的な意味を持っています。 Scala Java scala.SerialVersionUID [32] serialVersionUID [33] (フィールド) scala.cloneable [34] java.lang.Cloneable [35] scala.deprecated [36] java.lang.Deprecated [37] scala.inline [38] (2.6.0から) 等価なもの無し scala.native [39] (2.6.0から) native [40] (キーワード) scala.remote [41] java.rmi.Remote [42] scala.serializable [43] java.io.Serializable [44] scala.throws [45] throws [40] (キーワード) scala.transient [46] transient [40] (キーワード) scala.unchecked [47] (2.4.0から) 等価なもの無し scala.volatile [48] volatile [40] (キーワード) scala.reflect.BeanProperty [49] Design pattern [50] 次の例では、Java main プログラム中で例外送出をキャッチするために、メソッド read の定義に throws アノテーションを加えています。 Java コンパイラは、どのチェック例外がメソッドあるいはコンストラクタの実行によって引き起こされるか分析し、プログラムがチェック例外 [51]用のハンドラを含むことを確認します。起きる可能性のある各チェック例外に対して、メソッドあるいはコンストラクタの throw 節では、その例外クラスあるいはその例外クラスのスーパークラスの 1 つに言及しなくてはなりません。 Scala にはチェック例外がないので、Java コードが Scala メソッドの送出する例外を捕えることができるように、Scala メソッドに 1 つ以上の throws アノテーションをつける必要があります。 package examples import java.io._ class Reader(fname String) { private val in = new BufferedReader(new FileReader(fname)) @throws (classOf [IOException]) def read() = in.read() } (訳注 thorws [45], classOf [52] ) 次の Java プログラムはファイルの内容を印字します。ファイル名は main メソッドに最初の引数として渡されます。 package test; import examples.Reader; // Scala クラス !! public class AnnotaTest { public static void main(String[] args) { try { Reader in = new Reader(args[0]); int c; while ((c = in.read()) != -1) { System.out.print((char) c); } } catch (java.io.Exception e) { System.out.println(e.getMessage()); } } } クラス Reader 中の throws アノテーションをコメントアウトすると、Java main プログラムのコンパイル時に、次のエラーメッセージが出力されます Main.java 11 Exception java.io.IOException is never thrown in body of corresponding try statement } catch (java.io.IOException e) { ^ 1 error Java アノテーション 注意 Java アノテーションの -target jvm-1.5 オプションの使用を確認してください。 Java 1.5 は、アノテーション [53]の形でユーザー定義メタデータを導入しました。アノテーションの重要な特徴は、指定された名前と値の対を信頼して、それら要素を初期化することです。 例えば、もしあるクラスのソースを追跡するアノテーションが必要なら、次のように定義するかもしれません。 Java annotations @interface Source { public String URL(); public String mail(); } それを次のように適用してください @Source(URL = "http //coders.com/", mail = "support@coders.com") public class MyClass extends HisClass ... Scala のアノテーション適用は、Java アノテーションのインスタンス化のために名前付き引数を使う必要があるので、コンストラクタ呼び出しのように見えます。 @Source(URL = "http //coders.com/", mail = "support@coders.com") class MyScalaClass ... もしアノテーションが(デフォルト値をもたない) ただ 1 つの要素を含むだけなら、この構文はたいへんうんざりします。そこで、規約により(by convention)、もし名前を値として指定するなら、それをコンストラクタに似た構文を使って Java 中で適用できます。 @interface SourceURL { public String value(); public String mail() default ""; } それを次のように適用してください @SourceURL("http //coders.com/") public class MyClass extends HisClass ... In this case, Scala provides the same possiblity. この場合、Scala は同じことを提供します。 @SourceURL("http //coders.com/") class MyScalaClass ... mail 要素はデフォルト値を指定されているので、それに明示的に値を与える必要はありません。しかし、もしそうする必要があっても、Java 中で 2 つのスタイルを混ぜて適応させることはできません。 @SourceURL(value = "http //coders.com/", mail = "support@coders.com") public class MyClass extends HisClass ... Scala はこの点に関してより柔軟です。 @SourceURL("http //coders.com/", mail = "support@coders.com") class MyScalaClass ... この拡張された構文は、.NET のアノテーションでも同じあり、それらアノテーションのフルの能力を引き出します。 Scala ひと巡り クラス (Classes) 原ページ Scala のクラスは静的なテンプレートであり、実行時にたくさんのオブジェクトへインスタンス化されます。 次は、クラス Point を定義するクラス定義です class Point(xc Int, yc Int) { var x Int = xc var y Int = yc def move(dx Int, dy Int) { x = x + dx y = y + dy } override def toString() String = "(" + x + ", " + y + ")"; } クラスは 2 つの変数 x と y、2 つのメソッド move と toString を定義します。move は 2 つの整数を引数にとりますが、値を返しません (暗黙の戻り値型 Unit は、Java ライクな言語の void に相当します)。他方、toString は引数をとらず、String 値を返します。toString は事前定義された toString メソッドをオーバライドするので、override フラグでタグ付けしなければなりません。 Scala のクラスは、コンストラクタ引数でパラメータ化されます。上記のコードは 2 つのコンストラクタ引数 xc と yc を定義します;それらは共にクラス本体全体で可視です。この例では、それらは変数 x と y の初期化に使われています。 クラスは、次の例が示すように、new プリミティブでインスタンス化できます object Classes { def main(args Array[String]) { val pt = new Point(1, 2) println(pt) pt.move(10, 10) println(pt) } } このプログラムは実行可能なアプリケーション Classes を、main メソッドをもつトップレベルのシングルトンオブジェクトの形で定義します。main メソッドは新しい Point を生成し、それを値 pt に記憶します。val 構文で定義された値は更新が許されないという点が、var 構文(上記 クラス Point 参照)で定義された変数とは異なることに注意してください; すなわち、値(value)は不変です。 次はプログラムの出力です (1, 2) (11, 12) Scala ひと巡り ケースクラス (Case Classes) 原ページ Scala はケースクラスの概念をサポートします。ケースクラスは通常のクラスであり、そのコンストラクタ・パラメータをエクスポートし、パターンマッチング [11]を介して再帰的な分解メカニズムを提供します。 次は、1 つの抽象スーパークラス Term と 3 つの具象ケースクラス Var、Fun と App からなるクラス階層の例です。 abstract class Term case class Var(name String) extends Term case class Fun(arg String, body Term) extends Term case class App(f Term, v Term) extends Term このクラス階層は、型付けされていない(untyped) λ計算 [54]の項を表現するのに使えます。ケースクラスのインスタンス構築にあたり、Scala では new プリミティブを使う必要がありません。単純に、クラス名を関数として使用できます。 次は 1 つの例です Fun("x", Fun("y", App(Var("x"), Var("y")))) ケースクラスのコンストラクタ・パラメータは公開の値として扱われ、直接アクセスできます。 val x = Var("x") Console.println(x.name) すべてのケースクラスに対して、Scala コンパイラは、構造的等価性を実装する equals メソッドと toString メソッドを生成します。たとえば val x1 = Var("x") val x2 = Var("x") val y1 = Var("y") println("" + x1 + " == " + x2 + " = " + (x1 == x2)) println("" + x1 + " == " + y1 + " = " + (x1 == y1)) は、次のように印字するでしょう。 Var(x) == Var(x) = true Var(x) == Var(y) = false もしパターンマッチングをデータ構造の分解に使うなら、ケースクラスを定義するのが妥当です。次のオブジェクトは、λ計算を表現するプリティプリンタ関数を定義します object TermTest extends Application { def printTerm(term Term) { term match { case Var(n) = print(n) case Fun(x, b) = print("^" + x + ".") printTerm(b) case App(f, v) = Console.print("(") printTerm(f) print(" ") printTerm(v) print(")") } } def isIdentityFun(term Term) Boolean = term match { case Fun(x, Var(y)) if x == y = true case _ = false } val id = Fun("x", Var("x")) val t = Fun("x", Fun("y", App(Var("x"), Var("y")))) printTerm(t) println println(isIdentityFun(id)) println(isIdentityFun(t)) } この例で関数 print は、パターンマッチング文として表現されており、それは match キーワードで始まる case Pattern = Body 節の並びから成っています。 上記のプログラムは、与えられた項が単純な識別関数に対応するかどうかチェックする関数 isIdentityFun も定義します。この例は、深いパターンとガードを使います。与えられた値をもつパターンとマッチした後、その(キーワード if の後に定義された)ガードが評価されます。もしそれが true を返すなら、マッチは成功です。;そうでなければ失敗であり、次のパターンが試みられます。 Scala ひと巡り 事前定義された classOf 関数 (Predefined function classOf) 原ページ 事前定義された関数 classOf[T]は、 Scala のクラス型 T の実行時表現を返します。次の Scala コード例は、 args パラメータの実行時表現を印字します object ClassReprTest { abstract class Bar { type T AnyRef def bar(x T) { println("5 " + x.getClass()) } } def main(args Array[String]) { println("1 " + args.getClass()) println("2 " + classOf[Array[String]]) new Bar { type T = Array[String] val x T = args println("3 " + x.getClass()) println("4 " + classOf[T]) }.bar(args) } } 次は Scala プログラムの出力です 1 class [Ljava.lang.String; 2 class [Ljava.lang.String; 3 class [Ljava.lang.String; 4 class [Ljava.lang.String; 5 class [Ljava.lang.String; Scala ひと巡り 複合型 (Compound Types) 原ページ ときには、オブジェクトの型が、他の複数の型のサブ型であると表現することが必要になります。Scala では、それをオブジェクト型の論理積である複合型(compound types)の助けを借りて表現できます。 2 つのトレイト Cloneable と Resetable があるとします。 trait Cloneable extends java.lang.Cloneable { override def clone() Cloneable = { super.clone(); this } } trait Resetable { def reset Unit } いま、オブジェクトを引数にとってクローンし、オリジナルのオブジェクトをリセットする関数 cloneAndReset を書きたいとします。 def cloneAndReset(obj ?) Cloneable = { val cloned = obj.clone() obj.reset cloned } パラメータ obj の型は何か、という問題が生じます。もしそれが Cloneable なら、オブジェクトはクローンできますがリセットできません。; しかしもし Resetable なら、リセットできますがクローン操作がありません。そのような状況で型キャストを避けるために、obj の型が Cloneable と Resetable の両方であると指定できます。Scala では、複合型を使って Cloneable with Resetable のように書きます。 次は、アップデートした関数です def cloneAndReset(obj Cloneable with Resetable) Cloneable = { //... } 複合型は複数のオブジェクト型からなり、ただ一つの細別(refinement)を持てます。細別は既存のオブジェクトメンバーのシグニチャを狭めるのに使えます。 一般的な書き方は A with B with C ... { refinement } です。 細別の使用例は、抽象型 [21]に関するページにあります。 Scala ひと巡り シーケンス内包表記 (Sequence Comprehensions) 原ページ Scala は、シーケンス内包表記式に対して簡単な表記法を提供します。内包表記は for enums yield e の形をしています。ここで enums は、セミコロンで分離された列挙子のリストを参照します。列挙子は、新しい変数を導入する生成子、あるいは、フィルタです。内包表記は、列挙子 enum によって生成された各束縛にごとに、本体 e を評価し、それら値のシーケンスを返します。 次は 1 つの例です object ComprehensionTest1 extends Application { def even(from Int, to Int) List[Int] = for (i - List.range(from, to) if i % 2 == 0) yield i Console.println(even(0, 20)) } 関数 even 中の for 式は Int 型の新しい変数 i を導入し、それをリスト List(from,from + 1,...,to - 1) の全ての値へ次々に束縛します。ガード if i % 2 == 0 は、(式 i だけからなる)本体が偶数の場合のみ評価されるよう、全ての奇数をフィルターします。最終的に、for 式全体は偶数のリストを返します。 プログラムは次を出力します List(0, 2, 4, 6, 8, 10, 12, 14, 16, 18) 次はより複雑な例で、その合計が与えられた値 v と等しい、0 から n - 1 までの数の対をすべて計算します。 object ComprehensionTest2 extends Application { def foo(n Int, v Int) = for (i - 0 until n; j - i + 1 until n if i + j == v) yield Pair(i, j); foo(20, 32) foreach { case (i, j) = println("(" + i + ", " + j + ")") } } この例は、内包表記がリストに制限されないことを示しています。前のプログラムは、代わりにイテレータを使っています。(適切な型をもつ) 操作 filter、map そして flagMapをサポートするすべてのデータ型は、シーケンス内包表記中で使えます。 次はプログラムの出力です (13, 19) (14, 18) (15, 17) シーケンス内包表記で Unitを返す、特別の形式もあります。そこでは、生成子のリストとフィルターから生成される束縛は、副作用を起こさせるために使われます。そのようなシーケンス内包表記を利用するには、プログラマはキーワード yield を取り除かなければなりません。 次は、前のものと等価ではあるが Unit を返す、特別な for 内包表記を使うプログラムです。 object ComprehensionTest3 extends Application { for (i - Iterator.range(0, 20); j - Iterator.range(i + 1, 20) if i + j == 32) println("(" + i + ", " + j + ")") } Scala ひと巡り 抽出子オブジェクト (Extractor Objects) 原ページ Scala では、パターンをケースクラスとは独立に定義できます。この目的のために、unapply という名前のメソッドを定義することで、いわゆる抽出子がもたらされます。 例えば、次のコードは抽出子オブジェクト Twice を定義します。 object Twice { def apply(x Int) Int = x * 2 def unapply(z Int) Option[Int] = if (z%2 == 0) Some(z/2) else None } object TwiceTest extends Application { val x = Twice(21) x match { case Twice(n) = Console.println(n) } // prints 21 } 次は、ここで関係する 2 つの文法上の規約(convention)です パターン case Twice(n)は、Twice.unapply の呼び出しを引き起こし、偶数のマッチに使われます。; unapply の戻り値は、引数がマッチしたかどうか、そしてさらなるマッチングのために使えるサブ値を伝えます。ここで、サブ値は z/2 です。 The apply method is not necessary for pattern matching. It is only used to mimic a constructor val x = Twice(21) expands to val x = Twice.apply(21) . apply メソッドは、パターンマッチングについては必須ではありません。これはただ、コンストラクタをまねて val x = Twice(21) を val x = Twice.apply(21) へ展開する時に使われるだけです。 unapply の戻り値型は、次のように選ぶべきです もしそれが単なるテストなら、Boolean を返す。たとえば case even() 。 もしそれがただ一つの、型 T のサブ値を返すなら、Option[T]を返す。 もし複数のサブ値 T1,...,Tn を返したいなら、それらをまとめてタプルのオプション Option[(T1,...,Tn)]として返す。 しばしば、サブ値の数が固定で、シーケンスを返したいことがあります。その場合は、unapplySeq を介して同様にパターンを定義できます。最後のサブ値の型 Tn は、Seq[S]でなければなりません。このメカニズムは、たとえば、パターン case List(x1,...,xn) 中で使われます。 抽出子を使えば、コードはさらに保守しやすくなります。詳細は、Emir [56]、Odersky[57] と Williams (2007 年 1 月) らによる論文「パターンを用いたオブジェクトマッチング」[55](4 章参照) を読んでください。 前 先頭 次
https://w.atwiki.jp/mixiappdev/pages/12.html
人気商品一覧 @wikiのwikiモードでは #price_list(カテゴリ名) と入力することで、あるカテゴリの売れ筋商品のリストを表示することができます。 カテゴリには以下のキーワードがご利用できます。 キーワード 表示される内容 ps3 PlayStation3 ps2 PlayStation3 psp PSP wii Wii xbox XBOX nds Nintendo DS desctop-pc デスクトップパソコン note-pc ノートパソコン mp3player デジタルオーディオプレイヤー kaden 家電 aircon エアコン camera カメラ game-toy ゲーム・おもちゃ全般 all 指定無し 空白の場合はランダムな商品が表示されます。 ※このプラグインは価格比較サイト@PRICEのデータを利用しています。 たとえば、 #price_list(game-toy) と入力すると以下のように表示されます。 ゲーム・おもちゃ全般の売れ筋商品 #price_list ノートパソコンの売れ筋商品 #price_list 人気商品リスト #price_list
https://w.atwiki.jp/i_ro/pages/166.html
This page has been marked as being in need of links (Item/Monster/Map) to a Database. This page has been marked as being in need of links to other iRO Wiki pages. For a pre-Renewal version of this article, click here. Job Base(s) Crusader Job Type 2-2 Transcendent Changes At Juno× Number of Skills 4 Total Skill Points 25 Total Quest Skills 0 Job Bonuses STR AGI VIT INT DEX LUK +9 +8 +10 +7 +8 +3 +← クリックで目次を開く Overview Job Change Guide BuildsGrand Cross Mobber The Speedfreak (Paladin Version) Grand Cross FS GC/GD/Sac Battle MR/RS Battle MR/GD/Sac Hybrid RS/Heal/GC Mob/WoE Support Sac/GD/BC TacticsWoE EquipmentTanking/Defense Class DataSkills Job Bonuses ASPD See Also External links Overview Do you believe in the gods? Witness the Paladin s might and see the power of the divine for yourself! Non-believers are sure to convert and sinners will repent! The Paladin is a shining symbol of piety and devotion who uses his fighting ability in the service of the gods and his fellow man. His skills can punish the wicked or inspire the faithful. Paladins are the Transcendent variant of the Crusader class. Aside from the HP×/SP× boost, the Paladin s defensive capabilities have not seen significant changes. They do receive many new offensive abilities which inspiring many INT-built Crusaders to become battle-built Paladins. For those Paladins who wish to continue as an INT-type build, the Battle Chant× skill allows them to play a supportive role in large party settings, and the 20 additional skills points allow them to learn a much wider variety of skills. Job Change Guide To become a Paladin, you must find a book called the Book of Ymir in Sage Castle , Juno×. The book will lead you to Valhalla so you can change your job through the Lord Knight job NPC×. Also you must reach at least job level 40 as a transcendent 1st class character. 1.Sage Castle is located at 11 o clock direction (yuno 88,320) in Juno. 2. Book of Ymir is located inside a room behind an NPC called Metheus Sylphe (yuno_in02 88,164). 3.The Book of Ymir (yuno_in02 94,206) will teleport you to Valhalla. 4.Find and talk to a job NPC suited to your 2nd class. Builds Grand Cross Mobber STR× 1-20 AGI× 1 VIT× 80-99 INT× 80-99 DEX× 30-60 LUK× 1 Primary Skills Grand Cross× Peco Peco Ride× Heal× Divine Protection× Guard× Essentially, nothing more than a standard Grand Cross Crusader taking advantage of the additional skill points and 30% HP/SP bonus to max out their defensive skills. Still built for PvM×, this build revolves around forming huge mobs and either tanking them for a Wizard / ME× Priest (benefiting from Guard, Divine Protection, and Heal) or obliterating them with Grand Cross. The Speedfreak (Paladin Version) STR 28 + 22 AGI 99 + 39 VIT 2 + 10 INT 1 + 17 DEX 98 + 18 LUK 1 + 33 All stat with priest buffs. Primary Skills Sword Mastery× Bash× Smite× Shield Boomerang× Rapid Smiting× Peco Peco Ride Cavalier Mastery× Guard Shield Reflect× Defending Aura× Equipments Card Ghost Bandana Angel Wing Ears Panties[1] with Loli Ruri Card Thin Blade with Cecil Damon Card x 2 Strong Shield Or Cross Shield with Enchanted Peach Tree Card Underskirt[1] with Jr Baphomet Card Black Leather Boots[1] with Antique Firelock Card Horn of Buffalo x 2 with Kukre Card x 2 Berserk Potion This is a PVM build that aims for MAX ASPD (190) to auto cast heal on the character while attacking. This build focus more on counter attacking (Shield Reflect) and defensive tactic (auto cast Heal, Guard, Defending Aura), rather than being highly offensive as their Lord Knight counterpart (see Lord Knight s Build The Speedfreak). This build would be more ideal for monster that do not have high defence, deal high damage or high hit. With the counter attacking and defensive tactic, this allows the player to hunt non-stop as there is no need to rest (usually Heal, Guard and Defender Aura will take care of the damage received and Shield Reflect helps bring the mob down). The downside to this build are low HP, low damage, limited equipment choice, and priest buff dependent. Grand Cross FS STR 1-20 AGI 1 VIT 55-80 INT 80-99 DEX 50-75 LUK 1 Primary Skills Grand Cross Peco Peco Ride Heal Sacrifice× Battle Chant Finally, for Grand Cross Crusaders who have longed to obtain both Heal and Sacrifice can now do so. This build revolves around spending the 20 extra skills points on Heal, Sacrifice, and Battle Chant to whatever balance floats their boat. Effective in many PvM/MvP× situations, and useful in WoE×, where the FS Paladin s high INT and moderate DEX make their Grand Cross formidable, and where their wide array of supportive skills will make them very popular with Wizards and Sages. GC/GD/Sac STR 1-20 AGI 1 VIT 55-80 INT 75-85 DEX 75-90 LUK 1 Primary Skills Grand Cross Peco Peco Ride Sacrifice Gloria Domini× Devastating in PvP and WoE, the Gloria Domini Paladin uses a heavy balance of DEX to pull off a Sacrifice for their Wizard or Sage in even the most hectic of situations. The same DEX is also used to turn Grand Cross into a deadly and surprising weapon, and allows them to use Gloria Domini to cripple their opponents from afar. With a little help from Magic Strings×, a Gloria Domini + Sacrifice Paladin in the precast can be a serious problem for enemy Priests, Wizards,Ninjas,Snipers, and Crusaders, who watch helplessly as their SP disappears. With the aid of a Minstrel s Bragis Poem, it can kill low HP classes in just a matter of seconds. Battle MR/RS STR 60-80 AGI 1-50 VIT 90-99 INT 20-30 DEX 30-70 LUK 1 Primary Skills Martyr s Reckoning× Shield Reflect Guard Divine Protection Rapid Smiting Shrink× Shield Boomerang Sacrifice (Optional) Defending Aura (Optional) The ultimate tank of the game. This Paladin pulls off a combination of the protective shield skills along with high VIT to guarantee survival. Martyr s Reckoning can be used to annihilate any monster or player without reduction gears. Rapid Smiting can be spammed on those who do carry them. This build can pull off the dangerous combo by hitting with Martyr s Reckoning while it is in the Rapid Smiting cool down. Defending Aura eliminates the threat of ranged attackers, while Shield Reflect makes sure that any Assassin or Knight who tries to sneak up on you will not get away without heavily damaging themselves as well. Outside of WoE, Shrink bounces back any foolish player or monster who s planning to get a quick kill on you. In case you confront a Wizard, Shield Boomerang will take care of them momentarily. The one major undeniable weakness of this type is that they are vulnerable to Full Divestment× and Divest Shield×. Considering the high DEX of the build though, most Rogues and Stalkers will find it hard to strip you. Battle MR/GD/Sac STR 30-50 AGI 60-90 VIT 80-99 INT 1 DEX 40-60 LUK 1 Primary Skills Martyr s Reckoning Sacrifice Shield Reflect Guard Defending Aura (Optional) Shrink Shield Boomerang Also the ultimate tank of the game. This Paladin pulls off a combination of the protective shield skills along with high VIT to guarantee survival. Martyr s Reckoning can be used to annihilate any monster or player without reduction gears. Defending Aura eliminates the threat of ranged attackers, while Shield Reflect makes sure that any Assassin or Knight who tries to sneak up on you will not get away without heavily damaging themselves as well.Outside of WoE, Shrink bounces back any foolish player or monster who s planning to get a quick kill on you. In case you confront a Wizard, Provoke× is the best choice to momentarily take care of them due to it s faster spam rate than the paladin s other ranged skills. One major undeniable weakness of this type is that they are vulnerable to Full Divestment and Divest Shield. Also this build will be utilizing mastela fruits or slim white potions due to the limited weight capacity. Considering the moderate DEX of the build, most Rogues and Stalkers will find it hard to strip you. You can Sacrifice wizards while on the defense, but again due to the mediocre DEX of this build, Sacrifice will be very difficult to pull off while on the offense in the midst of a precast. Martyr s Reckoning is able to be performed while sacrificing the wizards This is to maximize the damage by combining the fire power of Martyr s Reckoning with wizard s spells. Hybrid RS/Heal/GC STR 30-40 AGI 1 VIT 50-60 INT 85-95 DEX 60-70 LUK 1 Primary Skills Grand Cross Shield Reflect Guard Heal Rapid Smiting Shrink Shield Boomerang Sacrifice (Optional) Peco Peco Ride This build is very hard and can only be used with the right equips. But its the best build to throw anyone off guard. You need to focus on either Grand Cross or Rapid Smiting. When building make sure your equipment is either INT for Grand Cross or STR for Rapid Smiting. You will need to carry around 3-4 armours, 2-3 accessories and 1-2 weapons. With the STR you ll be able to handle the weight with peco peco but use the lightest most effective armours and only one main. The armours you ll want are pest, marc and angleing then add in anymore you want from there. The purpose of this build to throw out a surprise at any time. When people phsically attack you throw on the pest armour. After they get stoned cursed Grand Cross them to death. When wizards are casting storm gust put on marc and Rapid Smiting them. If you can get a ghostring you ll be laughing when archers attack you just walk up and Grand Cross or Rapid Smiting from afar. The most important thing of this build is its fast cast time and power. To achieve the best cast get a clock tower manager card or 2. Then get zerom gloves. for you shoes use Matyr/Sohee/Verit. And if you are going int get a 2 andre haedoggum or 2 zipper bears(the sp subtract won;t mean much to you.). But you ll have to play around with this build and it will take time to prefect it. Depending on what you come across you can possibly defend against anything. ALWAYS have blue potions. SP will run dry fast at least carry 20 blue potions at all times. You will be the ulimate emperium guard. You can stand on the emperium and grand cross and be able to target afar. So far this is a build in process but the results have proven effective. Mob/WoE Support Sac/GD/BC STR 1-60 AGI 1 VIT 80-99 INT 1-60 DEX 80-90+ LUK 1 Primary Skills Sacrifice Shield Reflect Guard Gloria Domini Battle Chant Shield Boomerang Peco Peco Ride This is a very expensive build, as you sacrifice Heal for Battle Chant and thus must rely on pots when mobbing ahead in a party. Be warned this build limits you to pretty much nothing but parties. It has the potential to be an incredible tank, and a force in WoE. The trade off is the huge benefit of Battle Chant for your party in WoE. This build is incredibly effective in WoE, armed with a fast Sacrifice, a Fast Gloria Domini that can sap SP quickly, and Battle Chant to buff/de-buff your party/opponents. Gloria Domini is extremely effective against a Champion that is aiming for you, and can be a pain for other classes SP reliant. The high Dex makes it harder for Stalkers to strip, and even if they do succeed, you can just Battle Chant to rid yourself of it. The high Vit/HP makes Guillotine Fist× not as lethal in some cases, as well as making you Stun× proof and pots more effective. Int and Str can be changed to your preferences Higher Weight Limit×, or higher SP max. This build is a more of a WoE support build, but can do excellently as a tank in places like Nameless or Thors. It is however, extremely reliant on pots. Tactics WoE During WoE, a Paladin s role depends heavily on the user s build. Objectively, most players expect Paladins to protect their teammates. A fast cast sacrifice is vital to the survival of your teammates. High VIT allows you to move around and keep up your HP without worrying about stun recovers more HP with healing items. Battle Chant is very useful in buffing your party, and inflicting status effects on an enemy. Here are some special uses for Battle Chant Allows Wizard and Sage classes to have instant cast spells Allows Monks and Champions to have additional ATK× and doubles their max SP for a very powerful Guillotine Fists Buffs Lord Knights and doubles their max HP to allow them to achieve 60k HP frenzies× Immunity to Status Effects× for one minute allows team mates to not freeze/stone curse/stun even without the appropriate gear/stats. In short, Battle Chant can be used both offensively to buff your allies before breaking a pre-cast. It can also be used defensively to increase the damage done by your allies, or to slow down invading armies by inflicting them with status effects. Another application of Battle Chant is that its negative buffs and damage can affect even cloaked characters and stalkers under stealth×. Another special effect of Battle Chant is that when activated, it removes all status effects both good(Priest buffs, ASPD potions) and bad(negative status effects including strip). Gloria Domini is a skill that cannot be missed. Depending on the Gloria Domini skill level, opponents will lose 20~40% of their current sp. The skill is best used with high DEX and within Magic Strings. Some uses of the skill Bypasses opponent s Paladin s sacrifice, good against Wizards with low HP. Reduces a Champion s SP, Guillotine Fist s damage will be reduced tremendously. Reduces a Assassin Cross or Stalker SP, lowering their amount of time for Cloaking× or Stealth. Martyr s Reckoning is a situational skill. While it achieves high damage-per-second with high VIT and high AGI, it drastically reduces your HP to half depending on the ASPD×. Some uses of the skill are as follows Assists in killing a Classical Pluck× team Kills anyone without a Ghostring Armor Very good against Gyspy/Dancer spamming Dazzler× Builds that are focused with solely Martyr s Reckoning will find that it is harder for Assassin Crosses to kill you and other melee classes to hit you. Equipment Tanking/Defense Main target of this equip set is gaining the highest DEF and HP. All equipment in this set should be over +7 upgraded. Preferably as high as possible. Top headgear Helm (6 DEF×) Bone Helm (7 DEF) Spiky Band (6 DEF)For slotted version this headgears you can use Grand Peco Card with Peco Peco Card (gain DEF + 3 VIT + 3) in slotted armor. Magni s Cap (5 DEF)Odin s Blessing, Stone Buckler Magni s Cap Equip Set give STR + 2, DEF + 5, MDEF + 5 [Swordman Class] Additional DEF + 6. Middle headgear Fin Helm (2 DEF) Lower headgear Iron Cain (1 DEF) Spare Card Evolved Pipe (1 VIT -5% Damage from Brute× Monsters) Body armor Legion Plate Armor [1] (11 DEF) Meteor Plate [1] (10 DEF) 30% resistance to the Stun and Freeze status) Odin s Blessing [1] (6 DEF) (only Odin s Blessing, Stone Buckler Magni s Cap Equip Set). Selected cards Peco Peco Card (Gain +10% Maximum HP and Equip Set with Grand Peco Card). You can use also use auto-status cards i.e. Sasquatch Card or Dark Frame Card . Mineral Card (Gain ATK - 25 DEF + 3) Marc Card (Gain protection from the Freeze) use only on freezing monsters. Garment Wool Scarf [1] (3 DEF) (Tidal Shoes Wool Scarf Equip Set) Pauldron [1] (5 DEF) Cards Raydric Card reduces Neutral damage by 20%. Frequently the best garment card to choose for this purpose. Shield Sacred Mission [1] (5 DEF) (INT + 2, VIT + 3, MDEF× + 3 Indestructible) Stone Buckler [1] (3 DEF) (only Odin s Blessing, Stone Buckler Magni s Cap Equip Set). Shield [1] (6 DEF) Cards Racial cards (-30% damage from respective race). Plant× Race lacks an implemented card. In this case, Size cards (-25% from respective size, i.e. Mysteltainn -25% from small 1 DEF) and Hodremlin (-15% from all sizes) may also be used. Footgear Vidar s Boots (4 DEF) (Maximum HP and SP + 9%) Tidal Shoes [1] (3 DEF) ([+ Wool Scarf] HP Recovery + 5%. Increase Maximum HP by 10%). Cards Upgrade under +9 - Verit Card (+8% HP/SP) , Matyr Card (+10% HP, AGI +1), Green Ferus Card (+10% HP, VIT +1) . Upgrade +9 or more - Firelock Soldier Card (+10% HP/SP, STR +2). Accessories Safety Ring (3 DEF, 3 MDEF) Alligator card ed Rosaries for magic and other long ranged skills. Yoyo card ed (Perfect Dodge× +5, AGI +1), preferably in Slotted Rosarie s (3 MDEF, LUK +1) Weapons Anything that adds maximum HP or reduces damage. weapon [4] i.e. Main Gauche with 4 x Fabre Card Combat Knife (-10% damage from Demi Human×s) Exorciser (-5% damage from Demon×s) Fortune Sword (+20 Perfect Dodge +5 LUK) Class Data Skills For information about Crusader skills, click here. Skill Description Levels Type Battle Chant× Begins a chant that inflicts a random status ailment on enemies within range, while also endowing party members with random buffs. 10 Supportive Gloria Domini× Crush a target with a huge cross from the sky, dealing fixed damage. 5 Offensive Martyr s Reckoning× Sacrifices the user s HP in order to deal great damage onto a target. 5 Offensive Rapid Smiting× Hurls the user s shield at a target, striking five times. 5 Offensive Job Bonuses Stat\Amount +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 STR 2 10 18 26 33 40 48 55 64 AGI 3 8 16 24 37 52 60 70 VIT 1 9 15 21 30 42 49 53 63 69 INT 7 14 29 43 54 61 65 DEX 6 12 17 23 36 45 57 68 LUK 39 59 67 ASPD This article or section is in need of attention from an expert on the subject.Please help recruit one or improve this article yourself. See the talk page for details. See Also Swordman Crusader External links Skilltree at Himeyasha s Skill Simulator Grand Cross Calculator compares base Grand Cross damage amongst different weapons -Crusader ・ Paladin ・ Royal Guard Crusader ・ Paladin ・ Royal Guard 2nd ClassSkills Cavalier Mastery× ・ Cure× ・ Defending Aura× ・ Demon Bane× ・ Divine Protection× ・ Faith× ・ Grand Cross× ・ Guard× ・ Heal× ・ Holy Cross× ・ Peco Peco Ride× ・ Resistant Souls× ・ Sacrifice× ・ Shield Boomerang× ・ Shield Reflect× ・ Shrink× ・ Smite× ・ Spear Mastery× ・ Spear Quicken× TranscendentSkills Battle Chant× ・ Gloria Domini× ・ Martyr s Reckoning× ・ Rapid Smiting× 3rd ClassSkills Banding× ・ Banishing Point× ・ Burst Attack× ・ Cannon Spear× ・ Earth Drive× ・ Exceed Break× ・ Genesis Ray× ・ Hesperus Lit× ・ Inspiration× ・ Moon Slasher× ・ Overbrand× ・ Piety× ・ Pinpoint Attack× ・ Prestige× ・ Reflect Damage× ・ Shield Press× ・ Shield Spell× ・ Trample× ・ Vanguard Force× Quests Crusader Job Change Guide ・ Crusader Skill Quest ・ Rebirth Walkthrough ・ Royal Guard Job Change Guide Weapons× One Handed Sword× ・ Spear× ・ Two Handed Sword× -Classes of Ragnarok Online Classes of Ragnarok Online Novice Class Novice ・ High Novice ・ Super Novice First Class / High First Class Acolyte ・ Archer ・ Mage ・ Merchant ・ Swordman ・ Thief Second Class Priest ・ Monk ・ Hunter ・ Bard ・ Dancer ・ Wizard ・ Sage ・ Blacksmith ・ Alchemist ・ Knight ・ Crusader ・ Assassin ・ Rogue Transcendent Second Class High Priest ・ Champion ・ Sniper ・ Minstrel ・ Gypsy ・ High Wizard ・ Scholar ・ Mastersmith ・ Biochemist ・ Lord Knight ・ Paladin ・ Assassin Cross ・ Stalker Third Class Arch Bishop ・ Sura ・ Ranger ・ Maestro ・ Wanderer ・ Warlock ・ Sorcerer ・ Mechanic ・ Geneticist ・ Rune Knight ・ Royal Guard ・ Guillotine Cross ・ Shadow Chaser Expanded Class Gunslinger ・ Ninja ・ TaeKwon Kid Expanded Second Class TaeKwon Master ・ Soul Linker ・ Kagerou ・ Oboro ・ Rebel× Doram Summoner Categories Articles Needing DB Links | Articles Needing Interwiki Links | Paladin | Classes | Crusader
https://w.atwiki.jp/itoukunn/pages/61.html
ドレスアップにてよくある質問をまとめました。 ドレスアップに関するよくある質問 ドレスアップで馬力はあがりますか? ドレスアップのウイングって? アクセス数(合計): - アクセス数(今日): - アクセス数(昨日): - ドレスアップに関するよくある質問 [部分編集] ドレスアップで馬力はあがりますか? 見た目だけで馬力はアップしません。 車の価格にドレスアップで使用した金額が加算されます。 ▲ページトップに戻る ドレスアップのウイングって? 車種によって取付可否あり。 取り付け可能車種 車種名 ウィング 種類 車種名 ウィング 種類 車種名 ウィング 種類 Chevy Aveo --- --- Audi TT --- --- Carrera GT --- --- Honda Civic --- --- BMW M3 可能 4 Koenigsegg 可能 6 VW Beetle --- --- Cadillac Escalade --- --- Enzo Ferrari 可能 6 Mini Cooper --- --- Acura NSX 可能 4 Pagani Zonda 可能 6 Ford Mustang 可能 4 Mercedes SLK --- --- McLaren F1 可能 6 Chevy Camaro 可能 4 Dodge Viper --- --- Lamborghini Reventon --- --- Mazda RX8 --- --- Corvette Z06 可能 4 Bugatti Veyron 可能 2 Lancer Evo 可能 4 Audi R8 可能 4 隠れ車種 Subaru Impreza 可能 4 Maserati GranTurismo --- --- Beetle Convertible --- --- Hummer H3 --- --- Porsche 911 可能 6 Dodge Challenger --- --- Toyota Supra 可能 4 Aston Martin DB9 可能 4 Corvette ZR1 可能 6 BMW Z4 可能 6 Ferrari F430 可能 4 Alfa Romeo 8C --- --- Lotus Elise 可能 4 Lamborghini Gallardo 可能 4 4種類 6種類で追加分 or Bugatti Veyron ▲ページトップに戻る
https://w.atwiki.jp/mixiap/pages/12.html
人気商品一覧 @wikiのwikiモードでは #price_list(カテゴリ名) と入力することで、あるカテゴリの売れ筋商品のリストを表示することができます。 カテゴリには以下のキーワードがご利用できます。 キーワード 表示される内容 ps3 PlayStation3 ps2 PlayStation3 psp PSP wii Wii xbox XBOX nds Nintendo DS desctop-pc デスクトップパソコン note-pc ノートパソコン mp3player デジタルオーディオプレイヤー kaden 家電 aircon エアコン camera カメラ game-toy ゲーム・おもちゃ全般 all 指定無し 空白の場合はランダムな商品が表示されます。 ※このプラグインは価格比較サイト@PRICEのデータを利用しています。 たとえば、 #price_list(game-toy) と入力すると以下のように表示されます。 ゲーム・おもちゃ全般の売れ筋商品 #price_list ノートパソコンの売れ筋商品 #price_list 人気商品リスト #price_list